#pragma once


#include <metalc/cls/_cls.h>
// #include <metalc/mlcc_int.h>

// DECL_SZLCS(lin)



// SAI PURE szcls_t __sz2cls_lin(size_t size, const size_t step){
    
//     szcls_t cls = align_up(size, step) / step;
    
//     // assert(__get_sz_bycls_log2g(min_size, max_size, cls) >= size);

//     //if(__get_sz_bycls_log2g(min_size, max_size, cls) < size) cls += 1;
//     return cls;
// }

// SAI PURE size_t __cls2sz_lin(szcls_t cls, const size_t step){
//     return cls * step; 
// }

/* 用宏函数实现方便在必要时直接生成数组 */
#define __cls2sz_lin(cls, step, minszbit)	(cls * step + BIT(minszbit))
#define __sz2cls_lin(sz, step, minszbit)	((align_up(size, step) - (1 << minszbit)) >> log2_align(step))

#define __clsnr_lin(bits_min, bits_max, step)	((BIT(bits_max) - BIT(bits_min)) >> log2_align(step))

#define DEF_CLS_LIN(name, LIN_MINSZBIT, LIN_MAXSZBIT, LIN_STEP)	\
DECL_SZLCS(name)						\
SASSERT(LIN_MAXSZBIT > LIN_MINSZBIT);				\
/* SASSERT(next_pow2_clz(LIN_STEP) == LIN_STEP); */		\
static const szcls_t _clsnr_##name = __clsnr_lin(LIN_MINSZBIT, LIN_MAXSZBIT, LIN_STEP);\
static const size_t _maxsz_##name = __cls2sz_lin(_clsnr_##name - 1, LIN_STEP, LIN_MINSZBIT);\
SAI PURE szcls_t _sz2cls_##name (size_t size){ return __sz2cls_lin(size, LIN_STEP, LIN_MINSZBIT); };\
SAI PURE size_t _cls2sz_##name (szcls_t cls){ return __cls2sz_lin(cls, LIN_STEP, LIN_MINSZBIT); };

/* 如何创建这个映射表?动态创建或者静态创建, 静态创建几乎是不可能(在没有constexpr的情况下) */

